// 此文件用于校验参数
const {verify} = require("../utils/jwt");

module.exports.check = function (queryKeys, bodyKeys = []) {
    // 返回中间件函数
    return function (req, res, next) {
        // 校验query参数
        for (let i = 0; i < queryKeys.length; i++) {
            const key = queryKeys[i];
            if (req.query[key] === undefined) {
                res.send({
                    code: 0,
                    msg: key + '参数缺失'
                });
                //结束函数运行，防止next函数被调用
                return;
            }
        }
        // 校验query参数
        for (let i = 0; i < bodyKeys.length; i++) {
            const key = bodyKeys[i];
            if (req.body[key] === undefined) {
                res.send({
                    code: 0,
                    msg: key + '参数缺失'
                });
                return;
            }
        }
        // 校验通过，处理下一个函数
        next();
    }
}

// 校验学生只能访问get接口
module.exports.checkStudentGet = function (req, res, next) {
    // 如果是学生, 并且请求方式不是GET,就返回校验失败
    if (req.userInfoLaoGuo.type === '0' && req.method !== "GET") {
        res.status(401).send({
            code: 0,
            msg: '权限校验失败'
        });
    } else {
        next();
    }
}

module.exports.checkManager = function (req, res, next) {
    if (req.userInfoLaoGuo.type === '0') {
        return res.status(401).send({
            code: '0',
            msg: '权限校验失败'
        })
    }
    next();
}

module.exports.verifyToken = function (req, res, next) {
    // console.log('这个函数用于解密token');

    // console.log(req.cookies);   // 客户端携带的cookie，需要使用 cookie-perser进行解析

    // 要求前端将token使用请求头的authorization发送过来
    const token = req.headers.authorization || (
        // 如果请求头中没有携带token，并且请求的获取视频资源，尝试去cookie中获取
        req.path === '/api/video/get-video' ? req.cookies.authorization : ''
    );
    // 解密
    verify(token)
        .then(data => {
            // console.log('用户信息为', data);
            // 我们可以对req对象进行拓展, 存储用户的信息
            // 随便添加一个属性,保存用户信息
            // 后面的请求处理函数就可以通过req.xx访问了
            req.userInfoLaoGuo = data;  // 后续请求处理函数使用req.userInfoLaoGuo获取用户信息
            next();
        })
        .catch(() => {
            // 设置响应状态码为401,一般表示认证失败
            res.status(401).send({
                code: 0,
                msg: "用户身份校验失败"
            });
        });
}
